package 剑指offer;
/** 

* @author ：soulstones
* @version ：2019年9月30日 下午10:03:49 
* @Description：
* 
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符，而'*'表示它前面的字符可以出现任意次（包含0次）。 在本题中，匹配是指字符串的所有字符匹配整个模式。例如，字符串"aaa"与模式"a.a"和"ab*ac*a"匹配，但是与"aa.a"和"ab*a"均不匹配
*/
public class A52正则表达式匹配 {

	public  static boolean match(char[] str, char[] pattern) {

		 if(str == null || pattern == null)
		            return false;
		        boolean [][] dp = new boolean[str.length + 1][pattern.length + 1];
		        dp[str.length][pattern.length] = true;
		        //开始循环
		        for (int i = str.length; i >= 0; i--) {//外循环：从空串开始匹配
		           for (int j = pattern.length - 1; j >= 0; j--) {//内循环：从最后一个字符开始匹配
		               if(j < pattern.length - 1 && pattern[j + 1] == '*') {
		                   //1.1：当前相等
		                   if(i < str.length && (str[i] == pattern[j] || pattern[j] == '.'))
		                       dp[i][j] = dp[i][j + 2] || dp[i + 1][j];
		                   else//1.2当前不等
		                       dp[i][j] = dp[i][j + 2];
		               }else {//若不是"*",看当前是否相等
		                    if(i != str.length && (str[i] == pattern[j] || pattern[j] == '.')) {//当前相等
		                        dp[i][j] = dp[i + 1][j + 1];
		                    }
		               }
		            }
		        }
		        return dp[0][0];
	}
	
	public static void main(String[] args) {
		
	}
}
